Public Class GDALRasterBand

    Private obj As Long
    Public XSize As Long
    Public YSize As Long
    Public BlockXSize As Long
    Public BlockYSize As Long
    Public DataType As Long

    ' ----------------------------------------------------------------------------
    Public Sub New()
        obj = 0
        XSize = 0
        YSize = 0
        BlockXSize = 0
        BlockYSize = 0
        DataType = 0
    End Sub

    ' ----------------------------------------------------------------------------
    Public Sub CInit(ByVal obj_in As Long)
        obj = obj_in
        XSize = GDALCore.GDALGetRasterBandXSize(obj)
        YSize = GDALCore.GDALGetRasterBandYSize(obj)
        Call GDALCore.GDALGetBlockSize(obj, BlockXSize, BlockYSize)
        DataType = GDALCore.GDALGetRasterDataType(obj)
    End Sub

    ' ----------------------------------------------------------------------------
    Public Function GetMinimum(ByRef bGetMin As Boolean) As Double
        'Dim Success As Long
        If obj <> 0 Then
            GetMinimum = GDALCore.GDALGetRasterMinimum(obj, bGetMin)
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function GetMaximum(ByRef bGotMax As Boolean) As Double
        'Dim Success As Long
        If obj <> 0 Then
            GetMaximum = GDALCore.GDALGetRasterMaximum(obj, bGotMax)
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function GetOffset() As Double
        Dim Success As Long
        If obj <> 0 Then
            GetOffset = GDALCore.GDALGetRasterOffset(obj, Success)
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetOffset(ByVal Offset As Double) As Long
        If obj <> 0 Then
            SetOffset = GDALCore.GDALSetRasterOffset(obj, Offset)
        Else
            SetOffset = GDALCore.ObjIsNULLError
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function GetScale() As Double
        Dim Success As Long
        If obj <> 0 Then
            GetScale = GDALCore.GDALGetRasterScale(obj, Success)
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetScale(ByVal NewScale As Double) As Long
        If obj <> 0 Then
            SetScale = GDALCore.GDALSetRasterScale(obj, NewScale)
        Else
            SetScale = GDALCore.ObjIsNULLError
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function GetNoDataValue(ByRef Success As Long)
        If obj <> 0 Then
            GetNoDataValue = GDALCore.GDALGetRasterNoDataValue(obj, Success)
        Else
            Success = 0
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetNoDataValue(ByVal NoDataValue As Double)
        If obj <> 0 Then
            SetNoDataValue = GDALCore.GDALSetRasterNoDataValue(obj, NoDataValue)
        Else
            SetNoDataValue = GDALCore.ObjIsNULLError
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function RasterIO _
        (ByVal RWFlag As Long, _
         ByVal XOff As Long, ByVal YOff As Long, _
         ByVal XSize As Long, ByVal YSize As Long, _
         ByVal DataArray As Long, ByVal BufXSize As Long, ByVal BufYSize As Long, ByVal DataType As Long) As Long

        RasterIO = GDALCore.GDALRasterIO( _
               obj, RWFlag, XOff, YOff, XSize, YSize, _
               DataArray, BufXSize, BufYSize, DataType, 0, 0)

        'If obj <> 0 Then
        '    Dim RawPtr, DataType, BufXSize, BufYSize As Long
        '    'RawPtr = GDALCore.SafeArrayToPtr(DataArray, DataType, _
        '    '                                 BufXSize, BufYSize)

        '    'If RawPtr <> 0 Then
        '    RasterIO = GDALCore.GDALRasterIO( _
        '        obj, RWFlag, XOff, YOff, XSize, YSize, _
        '        RawPtr, BufXSize, BufYSize, DataType, 0, 0)
        '    'Else
        '    ' RasterIO = 3 ' CE_Failure
        '    'End If
        'Else
        'RasterIO = GDALCore.ObjIsNULLError
        'End If

    End Function

    ' ----------------------------------------------------------------------------
    Public Function GetMetadata(ByVal Domain As String) As Object
        If obj <> 0 Then
            GetMetadata = GDALCore.GetMetadata(obj, Domain)
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetMetadata(ByVal MetaData As Object, ByVal Domain As String) As Object
        If obj <> 0 Then
            SetMetadata = GDALCore.SetMetadata(obj, MetaData, Domain)
        Else
            SetMetadata = GDALCore.ObjIsNULLError
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function GetMetadataItem(ByVal Name As String, ByVal Domain As String) As String
        If obj <> 0 Then
            GetMetadataItem = GDALCore.CStr2VB(GDALCore.GDALGetMetadataItem(obj, Name, Domain))
        Else
            GetMetadataItem = vbNullString
        End If
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetMetadataItem(ByVal Name As String, _
    ByVal Value As String, ByVal Domain As String) As Long
        If obj <> 0 Then
            SetMetadataItem = GDALCore.GDALSetMetadataItem(obj, Name, Value, Domain)
        Else
            SetMetadataItem = GDALCore.ObjIsNULLError
        End If
    End Function
    ' ----------------------------------------------------------------------------
    Public Function GetDescription() As String
        If obj <> 0 Then
            GetDescription = GDALCore.CStr2VB(GDALCore.GDALGetDescription(obj))
        End If
    End Function
    ' ----------------------------------------------------------------------------
    Public Function GetColorTable() As GDALColorTable
        Dim ct As New GDALColorTable
        If obj <> 0 Then
            Dim CTHandle As Long

            CTHandle = GDALCore.GDALGetRasterColorTable(obj)
            If CTHandle <> 0 Then
                Call ct.CInit(CTHandle, 0)
            End If
        End If
        GetColorTable = ct
    End Function

    ' ----------------------------------------------------------------------------
    Public Function SetColorTable(ByVal ColorTable As GDALColorTable) As Long
        If obj <> 0 And ColorTable.GetObjPtr() <> 0 Then
            SetColorTable = GDALCore.GDALSetRasterColorTable( _
                    obj, ColorTable.GetObjPtr())
        Else
            SetColorTable = GDALCore.ObjIsNULLError
        End If
    End Function

    Public Sub ComputeRasterMinMax(ByVal bApproxOK As Integer, ByVal adfMinMax() As Double)

        Call GDALCore.GDALComputeRasterMinMax(obj, bApproxOK, adfMinMax)

    End Sub
End Class
